
package com.interview.case04;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 购物车类，用于管理顾客购买的水果及计算总价。
 */
public class ShoppingCart {
    private Map<Fruit, Integer> cart;
    private List<Promotion> promotions;

    public ShoppingCart() {
        cart = new HashMap<>();
        promotions = new ArrayList<>();
    }

    /**
     * 添加水果及其购买的斤数到购物车。
     *
     * @param fruit    水果对象
     * @param quantity 购买的斤数
     */
    public void addFruit(Fruit fruit, int quantity) {
        if (fruit == null) {
            throw new IllegalArgumentException("水果不能为空");
        }
        if (quantity < 0) {
            throw new IllegalArgumentException("购买的斤数不能为负数");
        }
        cart.put(fruit, cart.getOrDefault(fruit, 0) + quantity);
    }

    /**
     * 添加一个促销策略到购物车。
     *
     * @param promotion 促销策略对象
     */
    public void addPromotion(Promotion promotion) {
        if (promotion == null) {
            throw new IllegalArgumentException("促销策略不能为空");
        }
        promotions.add(promotion);
    }

    /**
     * 计算购物车中所有水果的总价，并应用所有促销策略。
     *
     * @return 总价（元）
     */
    public BigDecimal calculateTotalPrice() {
        BigDecimal total = BigDecimal.ZERO;
        for (Map.Entry<Fruit, Integer> entry : cart.entrySet()) {
            Fruit fruit = entry.getKey();
            int quantity = entry.getValue();
            BigDecimal fruitTotal = fruit.calculateTotalPrice(quantity);
            total = total.add(fruitTotal);
        }

        // 应用所有促销策略
        for (Promotion promotion : promotions) {
            total = promotion.apply(total);
        }

        return total;
    }
}
